En Elixir, le traitement des données suit deux philosophies distinctes : Gourmand (Avid) et Paresseux. Comprendre ce compromis est essentiel pour l'efficacité mémoire et la stabilité du système.
1. Le Protocole Enumerable
Techniquement, les éléments pouvant être itérés sont dits implémenter le protocole Enumerable. Ce contrat commun permet à différentes structures de données de fonctionner avec le même ensemble de fonctions.
2. Modules Gourmands vs. Paresseux
Le Enum module est gourmand. Il peut potentiellement consommer tout le contenu d'une collection immédiatement, créant des listes intermédiaires à chaque étape du pipeline. En revanche, le Stream module est paresseux. La valeur suivante est calculée uniquement lorsqu'elle est nécessaire.
3. Spécification vs. Résultat
Une valeur Stream est une spécification de ce que nous voulions, mais pas le résultat. Les streams sont énumérables et composables, vous permettant d'empiler des transformations sans exécuter de travail jusqu'à ce que vous transmettiez le stream à un « récepteur avide » comme Enum.to_list/1.
4. Pureté du Paradigme
Mélanger les paradigmes (fonctionnel et orienté objet) affaiblit les avantages apportés par une approche fonctionnelle. Privilégiez les transformations déclaratives aux boucles impératives pour plus de prévisibilité.